【簡単エクセル/Excel VBA マクロ】異なるファイル間でのデータマッチング(照合・突合)|アプリ事例 #006


いつもありがとうございます!
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。
「どちらのファイルにデータが不足しているのか確認したい」
「特定の条件で一致する行を取り出したい」
このようなことを経験したことはありませんか? これらは、実際の業務でよくあることですよね。VBAを活用すれば、こうした煩雑な手作業を劇的に効率化することが可能です。
この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。
VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。
VBAで「異なるファイル間(複数ファイル間)でのデータマッチング(照合・突合)」を行う方法

シナリオ
以下のようなファイル・フォルダ構成です。
your_folder/
├── ファイルA.xlsx
├── ファイルB.xlsx
└── データを照合する.xlsmデータを照合する.xlsmがVBAコードを記述するファイルです。このデータを照合する.xlsmが、ファイルA.xlsx と ファイルB.xlsxを見に行き、データを照合します。
ファイルA.xlsx と ファイルB.xlsxのシートの中身は以下のようになっています。


ファイルA.xlsx と ファイルB.xlsxの各セルのデータをひとつずつ順番に見ていき、ファイルAに存在しているデータがファイルBにも存在していれば「マッチ」とします。
コードの実装

上述のシナリオを実現するコードと、その実行結果を示します。
Sub CompareAndHighlight()
' Contents ファイルAとファイルBの列1を総当たりで比較し、一致データを
' 赤色に変更して新しいファイルに保存する
' Version 1.0.0
' Last Update 2024/12/07
' Since 2024/12/07
' 変数宣言
Dim fa_path As String ' ファイルAのパス
Dim fb_path As String ' ファイルBのパス
Dim fa_wb As Workbook ' ファイルAのワークブック
Dim fb_wb As Workbook ' ファイルBのワークブック
Dim fa_ws1 As Worksheet ' ファイルAのワークシート(1)
Dim fb_ws1 As Worksheet ' ファイルBのワークシート(1)
Dim fa_last_row As Long ' ファイルAの最終行
Dim fb_last_row As Long ' ファイルBの最終行
Dim fa_row_idx As Long ' ファイルAのループ用インデックス
Dim fb_row_idx As Long ' ファイルBのループ用インデックス
' ファイルのパスを取得
fa_path = ThisWorkbook.Path & "\ファイルA.xlsx"
fb_path = ThisWorkbook.Path & "\ファイルB.xlsx"
' ファイルの存在確認
If Dir(fa_path) = "" Then
MsgBox "ファイルAが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
If Dir(fb_path) = "" Then
MsgBox "ファイルBが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
' ファイルを開く
Set fa_wb = Workbooks.Open(fa_path)
Set fb_wb = Workbooks.Open(fb_path)
' ワークシートを取得
Set fa_ws1 = fa_wb.Worksheets(1)
Set fb_ws1 = fb_wb.Worksheets(1)
' 最終行を取得
fa_last_row = fa_ws1.Cells(fa_ws1.Rows.Count, 1).End(xlUp).Row
fb_last_row = fb_ws1.Cells(fb_ws1.Rows.Count, 1).End(xlUp).Row
' 総当たりでデータを比較
' ファイルAのデータを1行ずつループ
For fa_row_idx = 1 To fa_last_row
' ファイルBのデータを1行ずつループ
For fb_row_idx = 1 To fb_last_row
' 比較対象のセルの値が一致する場合
If fa_ws1.Cells(fa_row_idx, 1).Value = fb_ws1.Cells(fb_row_idx, 1).Value Then
' テキストを赤に変更
fa_ws1.Cells(fa_row_idx, 1).Font.Color = vbRed
fb_ws1.Cells(fb_row_idx, 1).Font.Color = vbRed
End If
Next fb_row_idx
Next fa_row_idx
' 新しいファイルとして保存
fa_wb.SaveAs ThisWorkbook.Path & "\ファイルA_照合後.xlsx"
fb_wb.SaveAs ThisWorkbook.Path & "\ファイルB_照合後.xlsx"
' ファイルを閉じる
fa_wb.Close SaveChanges:=False
fb_wb.Close SaveChanges:=False
' 処理完了メッセージ
MsgBox "処理が完了しました。", vbInformation
End Sub
実行結果は次の通りです。







解説していきます!
' Contents ファイルAとファイルBの列1を総当たりで比較し、一致データを
' 赤色に変更して新しいファイルに保存する
' Version 1.0.0
' Last Update 2024/12/07
' Since 2024/12/07これは、コードの概要を示すコメントです。処理内容、バージョン情報、最終更新日を記載しており、コード管理に役立ちます。単なるコメントですので、VBAでの処理には何も影響しません。
' 変数宣言
Dim fa_path As String ' ファイルAのパス
Dim fb_path As String ' ファイルBのパス
Dim fa_wb As Workbook ' ファイルAのワークブック
Dim fb_wb As Workbook ' ファイルBのワークブック
Dim fa_ws1 As Worksheet ' ファイルAのワークシート(1)
Dim fb_ws1 As Worksheet ' ファイルBのワークシート(1)
Dim fa_last_row As Long ' ファイルAの最終行
Dim fb_last_row As Long ' ファイルBの最終行
Dim fa_row_idx As Long ' ファイルAのループ用インデックス
Dim fb_row_idx As Long ' ファイルBのループ用インデックスここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型 の構文で宣言します。これにより、各変数は As 以降で指定したデータ型のデータを格納できるようになります。
なお、各データ型の意味は下表の通りです。
| データ型 | 意味 |
|---|---|
| String | 文字列を扱うデータ型です。ファイルパスや名前などのテキスト情報を格納します。 |
| Workbook | Excelのワークブック(ファイル)を表すオブジェクト型です。操作対象のファイルを管理します。 |
| Worksheet | Excelのワークシート(1つのシート)を表すオブジェクト型です。シート内のデータや構造を管理します。 |
| Long | 数値を扱うデータ型です。-2,147,483,648 から 2,147,483,647 までの範囲の整数を格納できます。 |
' ファイルのパスを取得
fa_path = ThisWorkbook.Path & "\ファイルA.xlsx"
fb_path = ThisWorkbook.Path & "\ファイルB.xlsx"ここでは、比較対象となるファイルAとファイルBのパスを設定しています。ThisWorkbook.Pathは現在のファイル(データを照合する.xlsm)のパスを指します。そこに比較対象となるファイル名を追加して、パスとしています。
' ファイルの存在確認
If Dir(fa_path) = "" Then
MsgBox "ファイルAが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
If Dir(fb_path) = "" Then
MsgBox "ファイルBが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End Ifここでは、ファイルAとファイルBの存在を確認しています。Dir関数を使用して指定したパスにファイルが存在するかを判定し、存在しない場合はメッセージボックスを表示して処理を中断します。Dir関数は、指定したパスにファイルまたはフォルダが存在する場合、その名前を返します。存在しない場合は空文字列("")を返すため、ファイルの存在チェックが可能です。
' ファイルを開く
Set fa_wb = Workbooks.Open(fa_path)
Set fb_wb = Workbooks.Open(fb_path)ここでは、指定されたパスからファイルAとファイルBを開き、それぞれをワークブックオブジェクトに割り当てています。なお、Set キーワードは、オブジェクト型の変数に値を代入する際に使用します。文字列や数値など、オブジェクト以外の値を代入する場合には Set は不要です。この場合、wbaおよびwbb は Workbooks.Open が返すワークブックオブジェクトを格納する変数であるため、Set を使って代入しています。
' ワークシートを取得
Set fa_ws1 = fa_wb.Worksheets(1)
Set fb_ws1 = fb_wb.Worksheets(1)ここでは、開いたファイルAとファイルBの最初のシートを取得し、それぞれをワークシートオブジェクトに割り当てています。ここでも、同様にsetキーワードが必要になります。
' 最終行を取得
fa_last_row = fa_ws1.Cells(fa_ws1.Rows.Count, 1).End(xlUp).Row
fb_last_row = fb_ws1.Cells(fb_ws1.Rows.Count, 1).End(xlUp).Rowここでは、それぞれのシートの最終行を取得しています。Rows.Countは、シートの最大行数(通常は1,048,576行)を返し、その列の最下行を指定しています。次に、End(xlUp)を使うことで、指定された列の末尾から上方向にデータが入力されている最後のセルを見つけます。さらに、.Row を使用して、そのセルの行番号を取得します。この結果、データが入力されている最終行の行番号を変数に格納することができます。
' 総当たりでデータを比較
' ファイルAのデータを1行ずつループ
For fa_row_idx = 1 To fa_last_row
' ファイルBのデータを1行ずつループ
For fb_row_idx = 1 To fb_last_row
' 比較対象のセルの値が一致する場合
If fa_ws1.Cells(fa_row_idx, 1).Value = fb_ws1.Cells(fb_row_idx, 1).Value Then
' テキストを赤に変更
fa_ws1.Cells(fa_row_idx, 1).Font.Color = vbRed
fb_ws1.Cells(fb_row_idx, 1).Font.Color = vbRed
End If
Next fb_row_idx
Next fa_row_idxここでは、ファイルAとファイルBの列1を総当たりで比較しています。外側のForループでファイルAの各行を順番に処理し、内側のForループでその行をファイルBの全行と比較しています。つまり、ファイルAの1行目のデータとファイルBの全行を比較した後、次にファイルAの2行目とファイルBの全行を比較する、という流れです。
各繰り返し処理の中で、セルの値(Cells(row_idx_a, 1).ValueとCells(row_idx_b, 1).Value)を比較し、一致した場合は該当セルの文字色を赤色(vbRed)に変更します。これにより、一致するデータを視覚的に識別できるようになります。
ただし、この方法はデータの行数が多い場合は、比較の回数が増えるため処理時間が長くなることがあります。そのため、大規模なデータを扱う場合には、配列を使用するのが良いでしょう。配列に関しては、こちらの記事で解説していますので、合わせてご活用ください。
' 新しいファイルとして保存
fa_wb.SaveAs ThisWorkbook.Path & "\ファイルA_照合後.xlsx"
fb_wb.SaveAs ThisWorkbook.Path & "\ファイルB_照合後.xlsx"ここでは、照合結果を反映したファイルを、新しいファイルとして保存しています。元のファイルを上書きしないようにしています。
' ファイルを閉じる
fa_wb.Close SaveChanges:=False
fb_wb.Close SaveChanges:=Falseここでは、処理が完了した後、開いたファイルを閉じています。SaveChanges:=Falseにより、変更を保存せずに閉じています。
' 処理完了メッセージ
MsgBox "処理が完了しました。", vbInformationここでは、処理が正常に完了したことを知らせるメッセージを表示しています。

以上で、解説は終了です。ありがとうございました!
VBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
本稿では、「異なるファイル間でのデータマッチング(照合・突合)」を紹介をしました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。




